跳到主要内容

加载资源

在运行时动态加载和替换资源。

资源处理方法

Rive 文件中的资源可以通过多种方式加载:内嵌(embedded)、引用(referenced)或通过 CDN 托管。

使用资源处理器 API

实例化新的 RiveAnimationView 时,设置 riveAssetLoaderClass 属性,其值为负责处理运行时资源加载的类的完整路径字符串。

通过 XML

<app.rive.runtime.kotlin.RiveAnimationView
android:id="@+id/rive_font_load_simple"
app:riveStateMachine="State Machine 1"
app:riveAssetLoaderClass="app.rive.runtime.example.HandleRiveFontAsset"
app:riveResource="@raw/acqua_text" />

在伴随的 Activity 中,创建一个类实现 Rive 运行时的 ContextAssetLoader 抽象类,重写 loadContents 函数:

  • assetFileAsset 对象的引用,可获取名称、资源类型等属性
  • bytes:资源的字节数组(如内嵌资源)
override fun loadContents(asset: FileAsset, inBandBytes: ByteArray): Boolean

重要:返回值为 boolean。如果你自己处理资源加载,返回 true;如果让运行时尝试加载,返回 false

示例

package app.rive.runtime.example

import android.content.Context
import android.os.Bundle
import android.widget.FrameLayout
import androidx.appcompat.app.AppCompatActivity
import app.rive.runtime.kotlin.core.ExperimentalAssetLoader
import app.rive.runtime.kotlin.core.FileAsset
import app.rive.runtime.kotlin.core.ContextAssetLoader
import kotlin.random.Random

class FontLoadActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.rive_font_load_simple)
}
}

open class HandleSimpleRiveAsset(context: Context) : ContextAssetLoader(context) {
private val fontPool = arrayOf(
R.raw.montserrat,
R.raw.opensans,
)

override fun loadContents(asset: FileAsset, inBandBytes: ByteArray): Boolean {
val randFontIndex = Random.nextInt(fontPool.size)
val fontToLoad = fontPool[randFontIndex]
context.resources.openRawResource(fontToLoad).use {
return asset.decode(it.readBytes())
}
}
}

示例